package bbs.web.control;

import java.util.*;

import javax.servlet.http.*;

import org.apache.ibatis.session.*;
import org.apache.logging.log4j.*; 
import org.springframework.stereotype.*;
import org.springframework.ui.*;
import org.springframework.web.bind.annotation.*;  

import bbs.model.*;
import bbs.tran.*;

@Controller
public class PaperController extends WebController {

	/**
	 * Log4j logger
	 */
	static final Logger logger = LogManager.getLogger(PaperController.class);
	
	@RequestMapping(value="/bbsBoardView.con", method = {RequestMethod.GET, RequestMethod.POST} )
    public String viewBoard( Model model , HttpServletRequest request ,
    		@RequestParam(value="boardId", 		required=false, defaultValue="-1"	) Integer boardId, 
    		@RequestParam(value="delPaperId", 	required=false, defaultValue="-1" 	) Integer delPaperId ,
    		@RequestParam(value="viewPageNo", 	required=false, defaultValue="1" 	) Integer viewPageNo ) {
		
		String viewName = null;
		String svrMsg = "게시판에 오신 것을 환영합니다.";
    	String errMsg = null ;  
    	
    	logger.trace( "boardId: " + boardId );
    	
    	BbsSystem bbsSystem = this.bbsSystem;
    	User loginUser = bbsSystem.getLoginUser( request );
    	
    	if( loginUser == null ) {
    		// 로그인 사용자가 없으면,
    		// 로그인 화면으로 이동한다.
    		if( this.isForcedUserLoginAtFirst() ) { 
    			return "redirect:bbsUserLogin.con" ;
    		}
    	}
    	
    	if( boardId == null || boardId < 1 ) {
    		// 게시판 아이디가 없으면,
    		// 보드 목록 화면으로 이동한다.
    		return "redirect:bbsBoardList.con";
    	}
    	
    	SqlSession session = bbsSystem.getSqlSession(); 
    	
    	Board 			board = null;
    	List<Paper> 	papers = null;
    	if( boardId != null && boardId > 0 ) { 
    		Integer boardValid = null;
	    	board = bbsSystem.getBoard( session, boardId, loginUser, boardValid ); 
	    	Paper parentPaper = null;
			User  paperUser = null;
			
			if( board == null ) {
				errMsg = "조회할 게시판이 없습니다."; 
			} else if( ! board.isBoardValid() ) {
				errMsg = "이미 삭제된 게시판입니다." ;
			} else if( board != null  && board.isBoardValid() ) { 
				Integer paperId = null; 
				String paperName = null;
				Boolean paperValid = true ;
				papers = bbsSystem.getAllPapers( session, board, parentPaper, paperId, paperUser, paperName, paperValid , viewPageNo ); 
				if( papers.size() < 1 ) {
					errMsg = "문서 목록이 없습니다." ;
				} else {
					int newPaperCnt = board.getNewPaperCnt();
					
					if( newPaperCnt == 1 ) { 
						errMsg ="새로운 문서 " + newPaperCnt + "건이 있습니다.";
					} else if( newPaperCnt > 1 ) {
						errMsg ="새로운 문서 " + newPaperCnt + "건이 있습니다.";
					}
				}
				logger.trace( "papers size: " + papers.size() ); 
			}
    	} 
    	
    	if( delPaperId != null && delPaperId > 0 ) {
    		svrMsg = "문서[" + delPaperId +"] 가 삭제되었습니다.";
    	}
    	
    	logger.trace( "erroMsg: " 	+ errMsg );
    	logger.trace( "svrMsg: " 	+ svrMsg );
		
    	session.close();
    	
    	model.addAttribute( "boardId",  	boardId		);
    	model.addAttribute( "BOARD_ID",  	boardId		);
    	
    	model.addAttribute( "board", 		board 		);
    	model.addAttribute( "papers", 		papers 		);
    	
    	model.addAttribute( "svrMsg", 		svrMsg 		);
    	model.addAttribute( "errMsg", 		errMsg 		);  
    	
    	if( viewName == null ) {
    		viewName = "bbs_board_view.html" ;
    	}
    	
		return viewName ;
	}
	
	@RequestMapping(value="/bbsPaperView.con", method = {RequestMethod.GET, RequestMethod.POST} )
    public String viewPaper( Model model , HttpServletRequest request ,
    		@RequestParam(value="boardId"  		, required=false, defaultValue="-1") Integer boardId 	  ,
    		@RequestParam(value="paperId"  		, required=false, defaultValue="-1") Integer paperId 	  ,
    		@RequestParam(value="paperRno" 		, required=false, defaultValue="0" ) Integer paperRno 	  ,
    		@RequestParam(value="newPaper" 		, required=false, defaultValue="0" ) Integer newPaper 	  ,
    		@RequestParam(value="saveBtn" 		, required=false, defaultValue="0" ) Integer saveBtn 	  ,
    		@RequestParam(value="deleteBtn" 	, required=false, defaultValue="0" ) Integer deleteBtn    ,
    		@RequestParam(value="paperName" 	, required=false, defaultValue="0" ) String	 paperName    ,
    		@RequestParam(value="paperContent" 	, required=false, defaultValue="0" ) String	 paperContent
    		) {
		
		String viewName = null;
		String svrMsg = "게시판 문서 조회";
    	String errMsg = "" ;  
    	
    	logger.trace( "boardId: " + boardId + "; paperId: " + paperId );
    	
    	BbsSystem bbsSystem = this.bbsSystem;
    	User loginUser = bbsSystem.getLoginUser( request );
    	
    	if( loginUser == null ) {
    		// 로그인 사용자가 없으면,
    		// 로그인 화면으로 이동한다.
    		if( this.isForcedUserLoginAtFirst() ) { 
    			return "redirect:bbsUserLogin.con" ;
    		}
    	}
    	
    	if( boardId == null || boardId < 1 ) {
    		// 게시판 아이디가 없으면,
    		// 보드 목록 화면으로 이동한다.
    		return "redirect:bbsBoardList.con";
    	}
    	
    	if( newPaper != null && newPaper > 0 ) {
    		// 신규 문서 작성시.
    	} else if( paperId == null || paperId < 1 ) {
    		// 선택한 문서 아이디가 없으면, 게시판 조회 화면으로 이동한다.
    		errMsg = "문서 아이디값이 없습니다." ;
    		return "redirect:bbsBoardView.con";
    	} 
    	
    	SqlSession session = bbsSystem.getSqlSession();  
    	
    	if( saveBtn != null && saveBtn == 1 && paperId == -1 ) {
    		// 새글 저장시 
    		Integer nextPaperId = bbsSystem.getNextPaperId(session);
    		
    		if( nextPaperId == null ) {
    			errMsg += " 새 문서의 아이디를 가져올 수 없습니다.";
    		} else if( nextPaperId != null ) { 
	    		Paper paper = new Paper();
	    		
	    		paper.put( "PAPER_ID", nextPaperId );
	    		paper.put( "PAPER_NAME", paperName );
	    		paper.put( "PAPER_CONTENT", paperContent );
	    		
	    		Integer boardValid = 1;
		    	Board board = bbsSystem.getBoard( session, boardId, loginUser, boardValid ); 
		    	
		    	if( board == null ) {
		    		errMsg += " 새 글을 저장할 게시판이 이미 삭제되었습니다.";
		    	} else if( board != null ) { 
		    		int updCnt = bbsSystem.createNewPaper( session, loginUser, board, paper);   
		    		
		    		if( updCnt > 0 ) {
		    			// 조회시 사용할 문서 아이디를 갱신한다.
		    			paperId = nextPaperId;
		    			newPaper = -1 ;
		    			errMsg += " 새 문서가 저장되었습니다." ;
		    		} else if( updCnt < 1 ) {
		    			errMsg += " 새 문서를 저장할 수 없습니다." ;
		    		}
		    	} 
    		} 
    	} else if( saveBtn != null && saveBtn == 1 ) {
    		// 옛 글 저장시.
    		Paper paper = new Paper();
    		
    		paper.put( "PAPER_ID", paperId );
    		paper.put( "PAPER_NAME", paperName );
    		paper.put( "PAPER_CONTENT", paperContent );
    		
    		int updCnt = bbsSystem.savePaper(session, paper );   
    		
    		if( updCnt > 0 ) {
    			errMsg += " 문서가 저장되었습니다." ;
    		} else if( updCnt < 1 ) {
    			errMsg += " 문서를 저장할 수 없습니다." ;
    		}
    	} else if( deleteBtn != null && deleteBtn == 1 ) {
    		
    		Paper paper = new Paper();
    		
    		paper.put( "PAPER_ID", paperId );
    		paper.put( "PAPER_NAME", paperName );
    		paper.put( "PAPER_CONTENT", paperContent );
    		
    		int updCnt = bbsSystem.deletePaper(session, paper );   
    		
    		if( updCnt > 0 ) {
    			errMsg += " 문서가 삭제되었습니다." ;
    			// 적절한 곳으로 리다이렉트 함.    			
    			return "redirect:bbsBoardView.con?boardId=" + boardId
    					+ "&delPaperId=" + paperId ;
    		} else if( updCnt < 1 ) {
    			errMsg += " 문서를 삭제할 수 없습니다. ";
    		}
    		
    	}
    	
    	Board 			board = null;
    	Paper		 	paper = null;
    	if( boardId != null && boardId > 0 ) { 
    		Integer boardValid = null;
	    	board = bbsSystem.getBoard( session, boardId, loginUser, boardValid ); 
	    	Paper parentPaper = null;
			User  paperUser = null;
			
			if( board == null ) {
				errMsg = "조회할 게시판이 없습니다."; 
			} else if( ! board.isBoardValid() ) {
				errMsg = "이미 삭제된 게시판의 문서입니다." ;
			} else if( newPaper != null && newPaper > 0 ) {
				
				if( loginUser == null ) { 
					// 사용자 로근전이면,
					// 로그인 후, 다시 새 글 작성 페이지로 이동한다.
					String reqUrl = this.getReqUrlFull(request);
					
					return  "redirect:bbsUserLogin.con?redirectUrl=" + reqUrl ;
					
				} else if( loginUser != null ) { 
					// 새 문서 작성시.
					paper = new Paper();
					paper.put( "PAPER_ID"			, 	"" );
					paper.put( "PAPER_NAME"			, 	"" );
					paper.put( "PAPER_CONTENT"		, 	"" );
					paper.put( "PAPER_CRE_DATE"		, 	"" );
					paper.put( "PAPER_UPD_DATE"		, 	"" );
					paper.put( "PAPER_USER_NAME"	, 	loginUser.getUserName() );  
					
					errMsg += " 새 글 작성";
				}
				
			} else if( board != null  && board.isBoardValid() ) {   
				String 	qryPaperName 	= null; // 검색할 문서 이름
				Integer paperValid 		= null ;
				paper = bbsSystem.getPaper( session, board, parentPaper, paperId, paperUser, qryPaperName, paperValid ); 
				if( paper == null ) {
					errMsg = "문서가 없습니다." ;
				} else if( paper.isPaperValid() ) {
					// 문서 조회 기록을 저장한다.
					int updCnt = bbsSystem.logPaperAsRead(session, paper, loginUser );
					if( updCnt < 1 ) {
						errMsg += " 문서 조회 기록을 남길 수 없습니다." ;
		    		} else if( updCnt > 0 ) {
		    			errMsg += " 문서 조회 기록을 남겼습니다.";
		    		}
				} else if( ! paper.isPaperValid() ) {
					errMsg += " 이미 삭제된 문서입니다." ;
				}
				
				logger.trace( "papers " + paper ); 
			}
    	} 
    	
    	logger.trace( "erroMsg: " 	+ errMsg );
    	logger.trace( "svrMsg: " 	+ svrMsg );
		
    	session.close();
    	
    	model.addAttribute( "newPaper",  	newPaper		);
    	
    	model.addAttribute( "paperRno",  	paperRno		);
    	
    	model.addAttribute( "boardId",  	boardId		);
    	model.addAttribute( "BOARD_ID",  	boardId		);
    	
    	model.addAttribute( "paperId",  	paperId		);
    	model.addAttribute( "PAPER_ID",  	paperId		);
    	
    	model.addAttribute( "board", 		board 		);
    	model.addAttribute( "paper", 		paper 		);
    	
    	model.addAttribute( "svrMsg", 		svrMsg 		);
    	model.addAttribute( "errMsg", 		errMsg 		);  
    	
    	if( viewName == null ) {
    		viewName = "bbs_paper_editor.html" ;
    	}
    	
		return viewName ; 
		
	}
	
}
